const fs = require('fs');
const path = require('path');


// 定义文件路径
const inputFilePath = path.join(__dirname, 'public', 'layer', 'huxing.json');
const outputFilePath = path.join(__dirname, 'public', 'layer', 'huxing_converted.json');

// 定义基准点
const basePoint = {
    lng: 107.226713,
    lat: 34.400413
};

// 读取原始文件
fs.readFile(inputFilePath, 'utf8', (err, data) => {
    if (err) {
        console.error('读取文件失败:', err);
        return;
    }

    try {
        // 解析JSON数据
        const geoJson = JSON.parse(data);
        
        // 转换坐标
        const convertedGeoJson = convertCoordinates(geoJson, basePoint);
        
        // 写入转换后的文件
        fs.writeFile(outputFilePath, JSON.stringify(convertedGeoJson, null, 2), 'utf8', (err) => {
            if (err) {
                console.error('写入文件失败:', err);
                return;
            }
            console.log('坐标转换完成！转换后的文件已保存至:', outputFilePath);
        });
    } catch (error) {
        console.error('处理JSON数据时出错:', error);
    }
});

/**
 * 转换GeoJSON中的所有坐标
 */
function convertCoordinates(geoJson, basePoint) {
    if (!geoJson || !geoJson.features) {
        return geoJson;
    }

    // 遍历所有features
    geoJson.features.forEach(feature => {
        if (feature.geometry && feature.geometry.coordinates) {
            // 根据geometry类型处理不同的坐标结构
            switch (feature.geometry.type) {
                case 'MultiPolygon':
                    // MultiPolygon: [[[[lon, lat], ...], ...], ...]
                    feature.geometry.coordinates = feature.geometry.coordinates.map(polygonGroup => 
                        polygonGroup.map(polygon => 
                            polygon.map(coordinate => 
                                convertSingleCoordinate(coordinate, basePoint)
                            )
                        )
                    );
                    break;
                case 'Polygon':
                    // Polygon: [[[lon, lat], ...], ...]
                    feature.geometry.coordinates = feature.geometry.coordinates.map(polygon => 
                        polygon.map(coordinate => 
                            convertSingleCoordinate(coordinate, basePoint)
                        )
                    );
                    break;
                case 'LineString':
                    // LineString: [[lon, lat], ...]
                    feature.geometry.coordinates = feature.geometry.coordinates.map(coordinate => 
                        convertSingleCoordinate(coordinate, basePoint)
                    );
                    break;
                case 'Point':
                    // Point: [lon, lat]
                    feature.geometry.coordinates = convertSingleCoordinate(feature.geometry.coordinates, basePoint);
                    break;
            }
        }
    });

    return geoJson;
}

/**
 * 转换单个坐标点
 */
function convertSingleCoordinate(coordinate, basePoint) {
    if (!Array.isArray(coordinate) || coordinate.length < 2) {
        return coordinate;
    }

    const [originalLng, originalLat, ...rest] = coordinate;
    
    // 提取原始坐标的小数部分
    const lngDecimalPart = originalLng - Math.floor(originalLng);
    const latDecimalPart = originalLat - Math.floor(originalLat);
    
    // 构建新坐标：基准点的整数部分 + 原始坐标的小数部分
    const newLng = Math.floor(basePoint.lng) + lngDecimalPart;
    const newLat = Math.floor(basePoint.lat) + latDecimalPart;
    
    // 保留原始坐标的其他部分（如高程）
    return [newLng, newLat, ...rest];
}